package cn.bone.data01;

public class linkListTest2 {

    public static void main(String... args){

        Solution solution = new Solution();
        int[] numbers = {1,2,3,4,5};
        ListNode head = solution.create(numbers);
        solution.print(head);

        System.out.println("-------------------");
        ListNode node = solution.reverseList(head);
        solution.print(node);
    }

}


class Solution {


    /**
     * 根据数组生成链表
     */
    public ListNode create(int[] numbers){
        if(numbers==null || numbers.length==0){
            throw new RuntimeException("不能为空");
        }

        ListNode prev = null;
        ListNode head = null;
        for(int num : numbers){
            ListNode node = new ListNode(num);
            if(prev!=null){
                prev.next = node;
            }else {
                head = node;
            }

            prev = node;
        }
        return head;
    }


    /**
     *  传入链表的首元素，反转链表
     *  返回新链表的首元素
     */
    // head 首节点
    public ListNode reverseList(ListNode head){

        // 当前节点的前一个节点
        ListNode prev = null;
        // 当前节点
        ListNode curr = head;
        // 当前节点不为null，循环
        while(curr!=null){
            // 临时节点，指向当前节点的下一个节点
            ListNode nextTemp = curr.next;
            // 把当前节点的后指针指向前一个节点
            curr.next = prev;

            // 循环中的后移
            // 当前节点改成前一个节点
            // 下一个节点改成当前节点
            prev = curr;
            curr = nextTemp;
        }
        return prev;
    }


    /**
     * 打印链表
     */
    public void print(ListNode node){

        while(node!=null){
            System.out.println(node.val);
            node = node.next;
        }
    }


}

class ListNode {
    int val;
    ListNode next;
    ListNode(int x){
        val = x;
    }
}
